package com.yuye.java.redis.template.tools;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 *  基于HyperLogLog的网站UV统计类
 *
 * @author gzs
 */
public class HyperLogLog {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    /**
     *
     * 将指定的元素添加到HyperLogLog中，可以添加多个元素
     *
     * @author gzs
     * @param key HyperLogLog的key
     * @param value 要添加的元素
     */
    public void pfAdd(String key, String... value) {
        stringRedisTemplate.opsForHyperLogLog().add(key, value);
    }

    /**
     *
     * 当一次统计多个HyperLogLog时，需要对多个HyperLogLog结构进行比较，并将并集的结果放入一个临时的HyperLogLog，性能不高，谨慎使用
     *
     * @author gzs
     * @param key 多个key
     * @return Long 返回给定HyperLogLog的基数估算值。
     */
    public Long pfCount(String... key) {
        return stringRedisTemplate.opsForHyperLogLog().size(key);
    }

    /**
     *
     * 将多个HyperLogLog进行合并，将并集的结果放入一个指定的HyperLogLog中
     *
     * @author gzs
     * @param destKey 合并后保存的key
     * @param sourceKey HyperLogLog
     */
    public void pfMerge(String destKey, String... sourceKey) {
        stringRedisTemplate.opsForHyperLogLog().union(destKey, sourceKey);
    }
}
